#define __W25Q32_H_
#ifdef __W25Q32_H_
#include "main.h"
#include "font.h"
#include "spi.h"
#include "usart1.h"

// W25Q32参数
#define FLASH_CS SPI1_CS1
#define W25Q32_PAGE_SIZE 256                                       // 页大小256字节
#define W25Q32_SECTOR_SIZE 4096                                    // 扇区大小4096字节
#define W25Q32_START_ADDR (uint32_t)0x000000                       // 起始地址
#define W25Q32_END_ADDR (uint32_t)(((32 / 8) * (1024 * 1024)) - 1) // 结束地址
#define W25Q32_BUSY 0x01                                           // 忙位
#define W25Q32_WEL 0x02                                            // 写保护位

// spi命令
#define flash_byte_read spi1_byte_read
#define flash_byte_write spi1_byte_write
#define flash_read spi1_read
#define flash_write spi1_write

// 编程命令
#define USART_CMD_HEAD 0xABCDEF00               // 命令共有字节部分
#define ERASE_CHIP (USART_CMD_HEAD | 0x1)       // 擦除芯片
#define PROGRAM (USART_CMD_HEAD | 0x2)          // 编程
#define READDATA (USART_CMD_HEAD | 0x3)         // 读数据
#define PROGRAM_EXIT (USART_CMD_HEAD | 0x4)     // 退出编程
#define WRITE_ZK_OK_FLAG (USART_CMD_HEAD | 0x5) // 写字库已编程好的标志
#define GET_FLASH_ID (USART_CMD_HEAD | 0x06)    // 读取FLASH型号
#define zk_ok_flag "OK"                         // 字库OK标志
#define zk_not_ok_flag 0xFFFF                   // 字库OK标志清除字符串
#define ADDR_ZK_OK (W25Q32_END_ADDR - 1)        // 字库OK标志存储位置

// 握手应答信号
#define START_RECEIVE_TASK 0x00 // STM32准备好接收命令
#define TASK_FINISH 0x01        // STM32命令完成
#define READ_PRAMA 0x02         // STM32准备好接收参数
#define ERROR 0x03              // STM32认为参数错误
#define START_SEND_DATA 0x04    // STM32开始输出信息
#define TASK_BUSY 0x05          // 芯片正忙
#define FLASH_BUAD 4000000

// 存储扇区数据的
extern uint8_t sector_data[W25Q32_SECTOR_SIZE];

// 不直接调用的函数
void Transmit_1byte(uint8_t d);
uint16_t flash_get_id(void);
void flash_erace_chip();
void flash_write_enable(void);
uint8_t flash_read_state1(void);
uint8_t flash_read_state2(void);
uint8_t flash_read_state3(void);
void flash_sector_erace(uint32_t addr);
void flash_block_erase(uint32_t addr);
void flash_page_write(uint32_t addr, uint8_t *data, uint16_t size);
void flash_stepover_pagewrite(uint32_t addr, uint8_t *data, uint32_t size);

// 直接调用的函数
void flash_init();
void flash_program();
uint8_t zk_is_set_ok();
void flash_read_data(uint32_t addr, uint8_t *data, uint16_t size);
void flash_write_data(uint32_t addr, uint8_t *data, uint32_t size);

#endif
